package cn.ulc.common.util;

import cn.hutool.core.codec.Base64;
import cn.ulc.common.constant.enums.ResultCode;
import cn.ulc.common.exception.PlatformException;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Calendar;
import java.util.Date;

public class JwtUtil {

    private static String JWT_SECRET = "voiceBook_0909";

    /**
     * 创建jwt
     * @param userId
     * @return
     * @throws Exception
     */
    public static String createJWT(Long userId,String role) {
        return createJWT(userId,null,role);
    }
    /**
     * 创建jwt
     * @param userId
     * @return
     * @throws Exception
     */
    public static String createJWT(Long userId,Long companyId,String role) {
        Date iatDate = new Date();
        // expire time
        Calendar nowTime = Calendar.getInstance();
        //有1天有效期
        nowTime.add(Calendar.DATE, 1);
        Date expiresDate = nowTime.getTime();
        SecretKey key = generalKey();
        Claims claims = Jwts.claims();
        claims.put("userId", userId);
        if(companyId != null) {
            claims.put("companyId", companyId);
        }
        claims.put("role",role);
        claims.setAudience("water-company");
        claims.setIssuer("water-company");
        try {
            String token = Jwts.builder().setClaims(claims).setIssuedAt(iatDate).setExpiration(expiresDate)
                    .signWith(SignatureAlgorithm.HS512, key)
                    .compact();
            return token;
        }catch (Exception e) {
            throw new PlatformException("JWT生成异常");
        }
    }


    /**
     * 解析jwt
     * @param token
     */
    public static Claims parseJwtToken(String token) {
        try {
            SecretKey key = generalKey();  //签名秘钥，和生成的签名的秘钥一模一样
            Claims claims = Jwts.parser()  //得到DefaultJwtParser
                    .setSigningKey(key)         //设置签名的秘钥
                    .parseClaimsJws(token).getBody();//设置需要解析的jwt
            System.out.println(claims);
            return claims;
        }catch (Exception e) {
            throw new PlatformException(ResultCode.NO_LOGIN.getCode(),"token过期");
        }

    }

    /**
     * 由字符串生成加密key
     * @return
     */
    public static SecretKey generalKey(){
        String stringKey = JWT_SECRET;//本地配置文件中加密的密文7786df7fc3a34e26a61c034d5ec8245d
        byte[] encodedKey = Base64.decode(stringKey);//本地的密码解码[B@152f6e2
        System.out.println(encodedKey);//[B@152f6e2
        SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");// 根据给定的字节数组使用AES加密算法构造一个密钥，使用 encodedKey中的始于且包含 0 到前 leng 个字节这是当然是所有。（后面的文章中马上回推出讲解Java加密和解密的一些算法）
        return key;
    }
}
